import shutil
import pandas as pd
import numpy as np
import os
import glob


# 定义自动创建文件夹的函数
def make_folder(p):
    if os.path.exists(p):  # 判断文件夹是否存在
        shutil.rmtree(p)  # 如果存在删除原有目录的文件夹以及其中所有文件
    os.mkdir(p)


file_path = os.getcwd()  # 获取当前py文件的路径
local_path = file_path + '\\hebingbiao'
make_folder(local_path)
# 遍历当前路径的所有.doc文件
for file_name in glob.glob(os.path.join(file_path + '/duqushuju', '*.xlsx')):
    df1 = pd.read_excel(file_name)  # 读取数据
    df1 = df1.where(df1.notnull(), None)  # 将nan替换成none
    pd.set_option('display.max_columns', None)  # 显示所有列
    list2 = np.array(df1['编号']).tolist()  # 获得所有学号的list
    # 将数据框转换成list
    arr1 = np.array(df1)
    list1 = arr1.tolist()  # 用于存储所有数据
    # 用集合去重
    quchong_set = set(list2)
    connection = list1[:]
    # 遍历去重后的集合
    for n in quchong_set:
        list3 = [i for i, x in enumerate(list2) if x == n]  # 与索引生成可迭代的元组，获取所有学号数据对应的每个索引
        # 如果索引数目大于一，就说明该学号进行了重复测试，则将索引用于找出重复的学号
        if len(list3) > 1:
            # 打印出所有重复的学号
            list4 = []
            list5 = []
            for x in list3:
                connection.remove(list1[x])  # 移除要处理的数据
                if not list4:
                    list4 = list1[x]  # 用list4来存储重复数据的第一个
                else:
                    for n in range(len(list4)):
                        # 一二个互相对比来进行数据筛选
                        if list4[n] is None and list1[x][n] is not None:
                            list5.append(list1[x][n])
                        elif list1[x][n] is None and list4[n] is not None:
                            list5.append(list4[n])
                        else:
                            list5.append(list4[n])
                    connection.append(list5)  # 存储筛选后的数据
    df2 = pd.DataFrame(np.array(connection), columns=df1.columns)
    df3 = df2.sort_values(by='序号')  # 以序号排序
    new_name = file_name.strip(file_path)
    new_name = new_name.lstrip('/duqushuju\\')  # 生成文件名
    writer = pd.ExcelWriter(local_path + '\\' + new_name)  # 写入存储路径
    df3.to_excel(writer, 'Sheet', index=False)
    writer.save()
